# 导入所需的库
import os  # 用于文件和目录操作
import smtplib  # 用于发送邮件
from email.mime.multipart import MIMEMultipart  # 用于创建多部分邮件
from email.mime.text import MIMEText  # 用于创建文本内容
from email.mime.application import MIMEApplication  # 用于添加附件
import zipfile  # 用于创建压缩文件
from datetime import datetime  # 用于生成时间戳

# 导入配置读取工具
from backend.utils.config_reader import get_smtp_config

# 导出函数供其他模块使用
__all__ = ['compress_analysis_results', 'send_analysis_email']

def compress_analysis_results(analysis_dir):
    """
    将分析结果目录压缩成zip文件
    
    参数:
        analysis_dir (str): 需要压缩的目录路径
    
    返回:
        str: 生成的zip文件名
    """
    print(f"\n[调试] 开始压缩目录: {analysis_dir}")
    print(f"[调试] 检查目录是否存在: {os.path.exists(analysis_dir)}")
    
    # 生成时间戳，格式：年月日_时分秒
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    # 生成zip文件名，包含时间戳
    zip_filename = f"analysis_results_{timestamp}.zip"
    print(f"[调试] 将创建压缩文件: {zip_filename}")
    
    # 创建zip文件，使用ZIP_DEFLATED压缩方式
    with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
        # 遍历目录下的所有文件和子目录
        file_count = 0
        for root, dirs, files in os.walk(analysis_dir):
            print(f"[调试] 正在处理目录: {root}")
            print(f"[调试] 发现文件数量: {len(files)}")
            for file in files:
                # 获取完整的文件路径
                file_path = os.path.join(root, file)
                # 获取相对路径，用于在zip文件中保持目录结构
                arcname = os.path.relpath(file_path, os.path.dirname(analysis_dir))
                print(f"[调试] 添加文件到压缩包: {arcname}")
                # 将文件添加到zip文件中
                zipf.write(file_path, arcname)
                file_count += 1
    
    print(f"[调试] 压缩完成，共压缩 {file_count} 个文件")
    print(f"[调试] 压缩文件大小: {os.path.getsize(zip_filename) / 1024:.2f} KB")
    return zip_filename

def send_analysis_email(sender_email, sender_password, recipients, cc_recipients, zip_file):
    """
    发送带有分析结果附件的邮件
    
    参数:
        sender_email (str): 发件人邮箱
        sender_password (str): 发件人密码
        recipients (list): 收件人邮箱列表
        cc_recipients (list): 抄送人邮箱列表
        zip_file (str): 要发送的zip文件路径
    """
    # 获取SMTP配置
    smtp_config = get_smtp_config()
    
    print("\n[调试] 开始准备发送邮件")
    print(f"[调试] 发件人: {sender_email}")
    print(f"[调试] 收件人: {recipients}")
    print(f"[调试] 抄送人: {cc_recipients}")
    print(f"[调试] 附件文件: {zip_file}")
    print(f"[调试] 附件大小: {os.path.getsize(zip_file) / 1024:.2f} KB")
    print(f"[调试] SMTP服务器: {smtp_config['smtp_server']}:{smtp_config['smtp_port']}")
    
    # 创建邮件对象
    msg = MIMEMultipart()
    # 设置邮件头部信息
    msg['From'] = sender_email
    msg['To'] = ', '.join(recipients)  # 将收件人列表转换为逗号分隔的字符串
    msg['Cc'] = ', '.join(cc_recipients)  # 将抄送人列表转换为逗号分隔的字符串
    msg['Subject'] = f"告警分析报告 - {datetime.now().strftime('%Y-%m-%d %H:%M')}"
    
    # 设置邮件正文
    body = """
    各位好，

    附件是告警分析报告，包含以下内容：
    1. 告警分析报告（Markdown格式）
    2. 告警标题统计图
    3. 告警级别分布图
    4. 设备类型分布图
    5. 设备厂商分布图
    
    请查收最新的告警分析报告及相关图表，请解压到同一目录下，用支持显示图片的markdown软件打开。
    涉及厂商包括：中兴, 华为，超聚变，新华三，浪潮，请涉及到的各厂家对自己设备告警的原因进行分析并提出合理的解决方案。

    此致

--------------------------------
sxlibo@sn.chinamobile.com 
陕西移动网管中心云平台维护室 李波
13571822791

正德厚生-臻于至善

    """
    # 将正文添加到邮件中，使用UTF-8编码
    msg.attach(MIMEText(body, 'plain', 'utf-8'))
    
    # 添加zip文件作为附件
    print("[调试] 正在添加附件...")
    with open(zip_file, 'rb') as f:
        zip_attachment = MIMEApplication(f.read(), _subtype='zip')
        # 设置附件的文件名
        zip_attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(zip_file))
        msg.attach(zip_attachment)
    print("[调试] 附件添加完成")
    
    try:
        print("[调试] 正在连接SMTP服务器...")
        # 使用配置文件中的SMTP设置
        server = smtplib.SMTP_SSL(smtp_config['smtp_server'], smtp_config['smtp_port'])
        print("[调试] SMTP服务器连接成功")
        
        print("[调试] 正在登录邮箱...")
        # 登录邮箱
        server.login(sender_email, sender_password)
        print("[调试] 邮箱登录成功")
        
        # 合并收件人和抄送人列表
        all_recipients = recipients + cc_recipients
        print(f"[调试] 准备发送邮件给 {len(all_recipients)} 个收件人")
        
        # 发送邮件
        print("[调试] 正在发送邮件...")
        server.sendmail(sender_email, all_recipients, msg.as_string())
        # 关闭连接
        server.quit()
        print("邮件发送成功！")
        
        # 发送成功后删除临时zip文件
        print("[调试] 正在删除临时文件...")
        os.remove(zip_file)
        print(f"临时文件 {zip_file} 已删除")
        
    except smtplib.SMTPAuthenticationError as e:
        print(f"[错误] SMTP认证失败: {str(e)}")
        raise
    except smtplib.SMTPException as e:
        print(f"[错误] SMTP错误: {str(e)}")
        raise
    except Exception as e:
        print(f"[错误] 发送邮件时出错: {str(e)}")
        raise
